-- SPDX-License-Identifier: GPL-3.0-or-later

local ghost_desc = [=====[
  # 感染模式简介

  感染模式，当年一款类似狼人杀游戏中的一个模式，进行修改后加入游戏。

  ___

  ## 身份说明

  游戏初始身份配置为一个反贼和七名忠臣。

  各个身份胜利条件：

  - 忠臣：人类，目标是消灭所有僵尸。
  - 反贼：僵尸，目标是使所有人类（忠臣）变成僵尸（反贼）。

  ___

  ## 流程说明

  游戏开始时，所有玩家选择武将。
  此时，场上的身份配置是随机一人为反其余为忠。

  所有人在准备阶段都可以秘密的选择一个人，每轮结束时，忠臣可以查看选择的人的身份；若反贼选择的人的身份为忠臣，则转换其身份为反贼；若为反贼，则其死亡。
  当场上没有忠臣时，反贼胜利；场上没有反贼时，忠臣胜利。

  ___

  ## 奖惩规则

  任意玩家杀死反贼时，该玩家摸3张牌。

  任意玩家玩家杀死人类时，弃掉所有牌。

  ___

  ## 游戏结束条件

  - 场上没有忠臣：反贼获胜。
  - 场上没有反贼：忠臣获胜。

]=====]

local ghost_getLogic = function()
  local ghost_logic = GameLogic:subclass("ghost_logic")

  function ghost_logic:assignRoles()
    local room = self.room
    local n = #room.players
    local m = math.random(1,8)
    for i = 1, n do
      local p = room.players[i]
      if i == m then
        p.role = "rebel"
      else
        p.role = "loyalist"
      end
      room:setPlayerProperty(p, "role_shown", false)
      room:broadcastProperty(p, "role")
    end
    room:setTag("SkipNormalDeathProcess", true)
  end
  function ghost_logic:attachSkillToPlayers()
    GameLogic.attachSkillToPlayers(self)
    local room = self.room
    for _, p in ipairs(room.players) do
      room:handleAddLoseSkills(p, "ghost_attach&")
    end
  end
  return ghost_logic
end--发身份

local ghost_mode = fk.CreateGameMode{
  name = "ghost_mode",
  minPlayer = 8,
  maxPlayer = 8,
  logic = ghost_getLogic,
  rule = "#ghost_rule&",
  winner_getter = function(self, victim)
    if not victim.surrendered and victim.rest > 0 then
      return ""
    end
    local room = victim.room
    local hasghost = table.find(room.players, function(p)
      return p.role == "rebel"
    end) ~= nil

    local alive = table.filter(room.players, function(p)
      return not p.surrendered and not (p.dead and p.rest == 0)
    end)
    if #alive == 1 and not hasghost then
      return "rebel"
    end

    local rebel_win = true
    local lord_win = hasghost
    for _, p in ipairs(alive) do
      if table.contains({ "loyalist" }, p.role) then
        rebel_win = false
      end
      if table.contains({ "rebel" }, p.role) then
        lord_win = false
      end
    end

    local winner
    if lord_win then winner = "loyalist" end
    if rebel_win then winner = "rebel" end

    return winner
  end,--获胜条件
}

Fk:loadTranslationTable{
  ["ghost_mode"] = "感染模式",
  [":ghost_mode"] = ghost_desc,
}

return ghost_mode
